package com.kotlin.lib

/**
 * 带接受者的函数字面值
 *
 * kotlin提供了这样一种功能：可以通过指定的接受者对象来调用一个函数字面值。
 * 在函数字面值内部，你可以调用接受者对象的方法而无需使用任何额外的装饰符。
 *     val other: Int.(other: Int) -> Int = { other ->
 *     other + this
}
 * 这点和扩展函数很像
 */
fun main() {
    fun(x: Int, y: Int): Int {//用匿名函数1
        return x + y
    }

    fun(x: Int, y: Int) = x + y//用匿名函数2
//用匿名函数的方式替代lambda写法的filter
    arrayOf("hello", "world", "welcome").filter(fun(it: String): Boolean { return it.length > 5 })
        .forEach { println(it) }
    println("&&&&&&&&&&&&&&&&&&&&&&&&&")

    println(1.forceAdd(2))
    //可以被同一个函数接收，说明它们等效
    val other: Int.(other: Int) -> Int = { other ->
        other + this
    }
    println(comm(forceAdd, 1, 2))
    println(comm(other, 1, 2))
    println(comm(::forceAdd2, 1, 2))
}

fun comm(operator: (x: Int, y: Int) -> Int, a: Int, b: Int): Int {
    return operator(a, b)
}

fun forceAdd2(x: Int, y: Int): Int = x + y